package com.zl.learning.reflect;

import java.lang.reflect.InvocationTargetException;

public class ClassDemo {

    public static class ClassDemo1 {
        public static void main(String[] args) {
            //Foo的实例对象如何表示
            Foo foo1 = new Foo();//foo1就表示出来了.
            //Foo这个类 也是一个实例对象，Class类的实例对象,如何表示呢
            //任何一个类都是Class的实例对象，这个实例对象有三种表示方式

            //第一种表示方式--->实际在告诉我们任何一个类都有一个隐含的静态成员变量class
            Class c1 = Foo.class;

            //第二中表达方式  已经知道该类的对象通过getClass方法
            Class c2 = foo1.getClass();

            /*官网 c1 ,c2 表示了Foo类的类类型(class type)
             * 万事万物皆对象，
             * 类也是对象，是Class类的实例对象
             * 这个对象我们称为该类的类类型
             *
             */

            //不管c1  or c2都代表了Foo类的类类型，一个类只可能是Class类的一个实例对象
            System.out.println(c1 == c2);

            //第三种表达方式
            Class c3 = null;
            try {
                c3 = Class.forName("com.zl.learning.reflect.Foo");
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(c2 == c3);

            //我们完全可以通过类的类类型创建该类的对象实例---->通过c1 or c2 or c3创建Foo的实例对象
            try {
                //需要有无参数的构造方法
                Foo foo = (Foo) c1.getConstructor().newInstance();
                foo.print();
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }


        }

    }

    public static class ClassDemo2 {
        public static void main(String[] args) {

            Class c1 = int.class;//int 的类类型
            Class c2 = String.class;//String类的类类型   String类字节码（自己发明的)
            Class c3 = double.class;
            Class c4 = Double.class;
            Class c5 = void.class;

            System.out.println(c1.getName());
            System.out.println(c2.getName());
            System.out.println(c2.getSimpleName());//不包含包名的类的名称
            System.out.println(c5.getName());
        }

    }

    public static class ClassDemo3 {
        public static void main(String[] args) {
            String s = "hello";
            ClassUtil.printClassMethodMessage(s);

            Integer n1 = 1;
            ClassUtil.printClassMethodMessage(n1);
        }

    }

    public static class ClassDemo4 {

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ClassUtil.printFieldMessage("hello");
            System.out.println("=============");
            ClassUtil.printFieldMessage(1);

        }

    }

    public static class ClassDemo5 {

        public static void main(String[] args) {
            ClassUtil.printConMessage("hello");
            ClassUtil.printConMessage(1);
        }

    }
}
